%%This is a very basic article template.
%%There is just one section and two subsections.
\documentclass[pdftex,a4paper,14pt]{article}
\usepackage[cm]{fullpage}
\usepackage[a4paper]{geometry}
\usepackage{ifpdf}
\usepackage[utf8]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage[nottoc, notlof, notlot]{tocbibind}
\usepackage[unicode=true,pdftex,colorlinks=true,linkcolor=black,urlcolor=black,citecolor=black]{hyperref}
\usepackage[usenames,dvipsnames]{color}
\usepackage{listings}
\usepackage{float}
\usepackage{natbib}
\usepackage{graphicx}
\usepackage{url}
\usepackage{color}

\definecolor{colKeys}{rgb}{0,0,1}
\definecolor{colIdentifier}{rgb}{0,0,0}
\definecolor{colComments}{rgb}{0,0.5,1}
\definecolor{colString}{rgb}{0.6,0.1,0.1}

\lstset{%configuration de listings
language=Java,%
float=hbp,%
basicstyle=\ttfamily\small, %
identifierstyle=\color{colIdentifier}, %
keywordstyle=\color{colKeys}, %
stringstyle=\color{colString}, %
commentstyle=\color{colComments}, %
columns=flexible, %
tabsize=2, %
frame=trBL, %
frameround=tttt, %
extendedchars=true, %
showspaces=false, %
showstringspaces=false, %
numbers=left, %
numberstyle=\tiny, %
breaklines=true, %
breakautoindent=false, %
captionpos=b,%
xrightmargin=-0.1mm, %
xleftmargin=-0.1mm
}

\title{Migration Platform Plugin, Maven et Hudson}
\author{Hervé ESTEGUET}
\date{\today}
\ifpdf
\pdfinfo{
/Author (Herve ESTEGUET)
/Title (Migration Platform Plugin Et Hudson)
/Subject (Migration Platform Plugin Et Hudson)
/Keywords (Migration, Hudson)
/CreationDate (D:20100329212218)
}
\fi

\newfloat{code}{H}{cod}[section]
\floatname{code}{Snippet}

%% Puces au lieu de tirets dans les listes:
\renewcommand{\labelitemi}{\textbullet}
\renewcommand{\labelitemii}{\textbullet}
\renewcommand{\labelitemiii}{\textbullet}

\begin{document}
\maketitle
\tableofcontents
\clearpage

\section{Creation d'un repository p2}

Cette section décrit la création d'un repository p2 à partir d'une installation
locale d' éclipse.

\subsection{Via eclipse}

Créer une nouvelle configuration en sélectionnant le menu
 Run > Run configurations.
  
 Puis sélectionner l'application (voir \ref{fig:p2repo_config_main}): 
 
 \begin{code}
 \centering
 \begin{lstlisting}
 org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher
 \end{lstlisting}
 \label{cod:features_and_bundles_publisher}
 \end{code} 

\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{img/p2repo_config1_main.png}
\caption{Création d'une configuration}\label{fig:p2repo_config_main}
\end{figure}
\clearpage
Dans l' onglet arguments mettre la configuration suivante
	(\ref{fig:p2repo_config_args}):
	
\begin{code}
\begin{lstlisting}
-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} 
-source ${folder_prompt:Select a folder contianing plugins and features}
-metadataRepository file:/${folder_prompt:Select a target metadata folder} 
-artifactRepository file:/${folder_prompt:Select a target artifact folder}
-compress -publishArtifacts
\end{lstlisting}
\label{cod:features_and_bundles_publisher_args}
\end{code}

\begin{figure}[h!]
\centering
\includegraphics[width=\linewidth]{img/p2repo_config2_args.png}
\caption{Création d'une configuration}\label{fig:p2repo_config_args}
\end{figure}
	
\subsection{En ligne de commande}

Exécuter la commande (\ref{cod:p2repo_by_shell}) dans un terminal. 
En prenant soin de remplacer:
\begin{itemize}
  \item \$ECLIPSE\_HOME par le répertoire d'installation d'eclipse.
  \item \$P2\_REPO\_TARGET par le répertoire de votre choix. 
\end{itemize} 

\begin{code}
\begin{lstlisting}
java -cp $ECLIPSE_HOME/plugins/org.eclipse.equinox.launcher_<version>.jar 
org.eclipse.equinox.launcher.Main -application 
org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher 
-source $ECLIPSE_HOME -metadataRepository file:/$P2_REPO_TARGET 
-artifactRepository file:/$P2_REPO_TARGET 
-compress -publishArtifacts
\end{lstlisting}
\label{cod:p2repo_by_shell}
\end{code}

\section{Passage du projet sous Maven 3 et Tycho}

\subsection{Organisation du répertoire projet}
Réorganisation du répertoire projet en séparant bien les différentes composantes
du produit eclipse (voir \ref{fig:project_folder_layout}). On retrouve ainsi:
\begin{itemize}
  \item Un répertoire contenant les sources du plugin.
  \item Un répertoire contenant la configuration de la platform cible.
  \item Un répertoire pour l'update site.
  \item Un répertoire pour les features.
  \item Un répertoire qui contiendra le POM parent du projet.
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/mpp_folder_layout.png}
\caption{Organisation du projet}\label{fig:project_folder_layout}
\end{figure}

\subsection{Génération des fichiers pom.xml}
La génération des pom.xml se fait grâce au plugin maven \emph{Tycho}.
Qui scanne le répertoire et détecte les différents type de projets, pour
ensuite générer des pom.xml pouvant avoir les packaging:
\begin{itemize}
  \item{eclipse-plugin} : Pour les projets plugins
  \item{eclipse-feature} : Pour les projets features
  \item{eclipse-update-site} : Pour les updates sites
  \item{eclipse-application} : Pour les products
\end{itemize}
 
 La commande à exécuter est la suivante:
 
 \begin{code}
 \begin{lstlisting}
 mvn org.sonatype.tycho:maven-tycho-plugin:generate-poms -DgroupId=com.migration.platform
 -Dversion=1.0.0-SNAPSHOT
 \end{lstlisting}
 \label{cod:tycho_generate_poms}
 \end{code}
 
 L'exécution de cette command donne le résultat suivant:
 
\begin{code}
\begin{lstlisting}[language=sh]
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-tycho-plugin:0.11.1:generate-poms (default-cli) @ standalone-pom ---
[INFO] Scanning D:\Workspaces\MigrationPlatform.plugin.main basedir
[WARNING] Not a directory D:\Workspaces\MigrationPlatform.plugin.main\.tests
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.953s
[INFO] Finished at: Fri May 06 16:32:49 CEST 2011
[INFO] Final Memory: 5M/15M
[INFO] ------------------------------------------------------------------------
\end{lstlisting}
\label{cod:tycho_generate_poms_output}
\end{code}
 
 Une fois les pom.xml générés, on déplace le pom.xml du répertoire
courant dans le répertoire projet parent créé à cet effet; dans notre cas
\emph{com.migration.platform.plugin.build}.

Puis on met à jour les pom.xml pour tenir compte du déplacement du pom parent.
Le POM parent passe de:

\begin{code}
\begin{lstlisting}[language=xml]
  <modules>
    <module>com.migration.platform.plugin.feature</module>
    <module>com.migration.platform.plugin.main</module>
    <module>com.migration.platform.plugin.update_site</module>
  </modules>
\end{lstlisting}
\end{code}

A :

\begin{code}
\begin{lstlisting}[language=xml]
  <modules>
    <module>../com.migration.platform.plugin.feature</module>
    <module>../com.migration.platform.plugin.main</module>
    <module>../com.migration.platform.plugin.update_site</module>
  </modules>
\end{lstlisting}
\end{code}

Et dans les modules on modifie :

\begin{code}
\begin{lstlisting}[language=xml]
  <parent>
    <artifactId>com.migration.platform.plugin</artifactId>
    <groupId>com.migration.platform</groupId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
\end{lstlisting}
\end{code}

Par :

\begin{code}
\begin{lstlisting}[language=xml]
  <parent>
    <artifactId>com.migration.platform.plugin</artifactId>
    <groupId>com.migration.platform</groupId>
    <version>1.0.0-SNAPSHOT</version>
	<relativePath>../com.migration.platform.plugin.build/pom.xml</relativePath>
  </parent>
\end{lstlisting}
\end{code}

On complète ensuite le pom parent pour fournir la configuration globale du
projet. On rajoute ainsi:

\begin{itemize}
  \item La configuration des autres plugins maven (compiler, jar, \ldots).
  \item La configuration de tycho (osgi-compiler pour spécifier la version de
  java à utiliser).
  \item Les repositories supplémentaires (voir
  \ref{sec:target_platform_config}).
\end{itemize}

\subsection{Création d'une target platform}
\label{sec:target_platform_config}
La configuration d'une platform cible est un mécanisme d'eclipse
permettant de spécifier l'environnement minimum dont à besoin un plugin
ou une application RCP pour fonctionner.

Son importance dans le mécanisme de build headless de produit eclipse et le 
fait que \emph{Tycho} est capable de lire cette configuration de platform cible
pour résoudre les dépendances nécessaires au bon fonctionnement du build.

Plusieurs de signaler à \emph{Tycho} l'endroit ou il doit aller chercher les
dépendances des plugins.
La première est de déclarer directement un \textit{repository} dans le fichier
\emph{settings.xml} de maven ou encore dans le \emph{pom.xml} du projet parent.
Ceci peut être réalisé de la manière suivante:

\begin{code}
\begin{lstlisting}[language=xml]
<repositories>
{...}
	<repository>
		<id>helios</id>
		<layout>p2</layout>
		<url>http://downloads.eclipse.org/releases/helios</url>
	<repository>
{...}
</repositories>
\end{lstlisting}
\caption{Déclaration d'un depot P2}\label{cod:p2_repository_declaration}
\end{code}

La deuxième solution, est la création d'une plateforme cible à partir d'un IDE
eclipse, et dans un projet séparé. Puis lier cette platform cible à notre
projet, en créant un pom.xml (voir \ref{cod:target_platform_pom}) et en le
rattachant comme module du POM parent.

\begin{code}
\begin{lstlisting}[language=xml]
{...}
      <plugin>
      	<groupId>org.sonatype.tycho</groupId>
      	<artifactId>target-platform-configuration</artifactId>
      	<version>0.11.1</version>
      	<configuration>
      		<resolver>p2</resolver>
      		<target>
      			<artifact>
      				<groupId>com.migration.platform.plugin</groupId>
      				<artifactId>target-platform</artifactId>
      				<version>1.0.0-SNAPSHOT</version>
      				<classifier>com.migration.platform.plugin</classifier>
      			</artifact>
      		</target>
      		<environments>
      			<environment>
      				<os>win32</os>
      				<ws>win32</ws>
      				<arch>x86</arch>
      			</environment>
      		</environments>
      	</configuration>
      </plugin>
{...}
\end{lstlisting}
\caption{Configuration du pom de la target
platform}\label{cod:target_platform_pom}
\end{code}

\section{Hudson}
\label{sec:hudson}

\subsection{Installation et configuration}
\label{sec:hudson_config}

La configuration à été testé sous Windows XP et a nécessité
l' installation de:
\begin{itemize}
  \item JBoss AS 6.0.0 .
  \item Hudson 2.0.0 .\\
\end{itemize} 

Une fois la JBoss installé et hudson déployé. On démarre le serveur
d'application JBoss; tâche qui peut être effectuée manuellement ou encore
au démarrage du système si JBoss à été installé comme service.
On accède ensuite à l'interface utilisateur hudson en rentrant dans
un navigateur l'adresse : 

\begin{code}
\begin{lstlisting}
http://<nom-de-machine>:8080/hudson
\end{lstlisting}
\end{code}

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_07_admin.png}
\caption{Configuration de hudson}\label{fig:hudson_admin}
\end{figure}

Cette interface permet de configurer le répertoire d'installation de java
et celui de maven 3 (voir \ref{fig:hudson_admin}).

\subsection{Configuration du projet}
\label{sec:hudson_mpp_project_config}

\subsubsection{Créer une nouvelle tâche}
La création d'une nouvelle tâche s'effectue en cliquant sur l'onglet
nouvelle tâche de la page principale d'Hudson. Il s'agit ensuite de 
renseigner le nom de la tâche dans notre cas "<Migration Platform Plugin"> et de 
selectionner comme type de tâche un projet maven 2/3 (voir
\ref{fig:hudson_new_task}).

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_01_project_new_task.png}
\caption{Création d'une nouvelle tâche dans hudson}\label{fig:hudson_new_task}
\end{figure}

Une fois la tâche créée, elle apparaît dans la liste des tâches (voir
\ref{fig:hudson_task_list}) sous forme de lien pointant vers son tableau de bord
(voir \ref{fig:hudson_project_panel}).

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_02_project_task_list.png}
\caption{La liste des tâches}\label{fig:hudson_task_list}
\end{figure}

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_03_project_panel.png}
\caption{Interface du projet}\label{fig:hudson_project_panel}
\end{figure}

Le tableau de bord de la tâche permet de la piloter et notamment de la
configurer. On doit en effet (voir \ref{fig:hudson_project_config1} choisir
\emph{Subversion}) comme SCM et renseigner l'adresse du serveur; dans notre cas:

\begin{code}
\begin{lstlisting}
https://ntels02.sodifrance.fr/usvn/svn/evol_archi/trunk/Outils/MigrationPlatform/Projects/MigrationPlatform.plugin.main
\end{lstlisting}
\caption{Depot subersion du projet}\label{cod:project_svn_address}
\end{code}

L' accès à ce serveur nécessite une authentification que l'on peut configurer en
cliquant sur le lien "<Update credentials">, sans oublier d'autoriser hudson à
sauvegarder les données d'authentification.

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_04_project_config1.png}
\caption{Configuration du projet}\label{fig:hudson_project_config1}
\end{figure}


On doit ensuite renseigner hudson (voir \ref{fig:hudson_project_config2}) sur la
localisation du fichier pom.xml principale vu que celui ne se trouve pas à la
racine du projet. Dans notre cas : 

\begin{code}
\begin{lstlisting}
com.migration.platform.plugin.build/pom.xml
\end{lstlisting}
\end{code}

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_05_project_config2.png}
\caption{Configuration du projet (Suite)}\label{fig:hudson_project_config2}
\end{figure}

\subsubsection{Lancer un build}
Le lancement d'un build (voir \ref{fig:hudson_project_build}) peut s'effectuer à
partir du tableau de bord de la tâche (voir \ref{fig:hudson_project_panel}). A
noter que le premier build peut durer un certain temps du fait de la résolution
des dépendances des plugins eclipse du projet.

\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{img/hudson_06_project_build.png}
\caption{Lancement d'un build}\label{fig:hudson_project_build}
\end{figure}

\end{document}
